package com.guodi.model.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.guodi.model.entity.ApiIndicatorsGrowthRate;
import com.guodi.model.entity.ApiMapDivision;
import com.guodi.model.entity.IdtFillValue;
import com.guodi.model.entity.IdtMonitorValue;

import java.util.List;

/**
 * @描述：指标监测值表 服务类
 * @作者: 彭辉
 * @日期: 2020-06-05
 */
public interface IIdtMonitorValueService extends IService<IdtMonitorValue> {

    /**
     * @描述：根据id删除
     * @作者：彭辉
     * @日期：2020/12/4 9:51
     **/
    void deleteByIds(String... ids);

    /**
     * @描述:根据关键字搜索
     * @入参:
     * @出参:
     * @作者: 戴伙进
     * @日期: 2020/6/17 12:09
            **/
    List<IdtMonitorValue> listByKeyWord(String keyWord, Integer year, long pageSize, long start, String sort, String sortWay, String divisionCode, String orgId);

    /**
     * @描述:关键字搜索查询的总记录数
     * @入参:
     * @出参:
     * @作者: 戴伙进
     * @日期: 2020/6/17 15:08
     **/
    Integer listByKeyWordCount(String keyWord, String orgId);

    /**
     * @描述:关键字、行政区划搜索查询的总记录数
     * @入参:
     * @出参:
     * @作者: 汤厚韬
     * @日期: 2020/12/22 16:08
     **/
    Integer listByKeyWordAndCodeCount(String keyWord, Integer year, String divisionCode, String orgId);

    /**
     * @描述:通过行政编码获取行政区名称
     * @入参:
     * @出参:
     * @作者: 戴伙进
     * @日期: 2020/6/18 15:42
     **/
    String getNameByDivisionCode(String divisionCode);

    /**
    * @描述: 获取各行政区划的指标监测值
    * @入参:
    * @出参:
    * @作者: 代鹏刚
    * @日期: 2020/10/21 16:59
    **/
    List<IdtMonitorValue> getHistoryList(String indicatorsId, List<String> monitorTimeList, String divisionCode);

    /**
    * @描述: 获取当前指标最新监测值的更新日期数据
    * @入参:
    * @出参:
    * @作者: 代鹏刚
    * @日期: 2020/10/23 10:55
    **/
    List<IdtMonitorValue> getNewestData(String indicatorsId);

    /**
     * @描述:更新监测值预警状态字段（根据预警规划、检测值、规划值判断是否预警）
     * @入参:
     * @出参:
     * @作者: 汤厚韬
     * @日期: 2020/12/4 10:18
     **/
    void updateWarnStatus(String indicatorsId, String area, String targetYear, String targetValue);

    /**
     * @描述: 根据父级地区编码，查询其直接子级
     * @入参: parentDivisionCode 父级行政区编码
     * @出参: 直接子级
     * @作者: 陈宏成
     * @日期: 2021/01/14
     **/
    List<ApiMapDivision> listDirectChildDivision(String parentDivisionCode);

    /**
     * @描述：根据指标编码、年份、行政区划代码查询因子值
     * @作者：汤厚韬
     * @日期：2021/1/25
     **/
    List<IdtMonitorValue> listByIndicatorsIds(List<String> calculateFactorNameList, String time, String divisionCode);

    /**
     * @作者: 林楷 2021/4/27
     * @描述: 计算指标监测值年均增速
     * @参数: indicatorsId：指标模型ID
     * @参数: divisionCode：行政区划编号
     * @返回:
     */
    List<ApiIndicatorsGrowthRate> computeYearGrowthRateByIndicatorsAndDivision(String indicatorsId, String divisionCode);

    /**
     * 计算监测值的平均值
     * @入参： idtIdList 指标id列表
     * @入参： divisionCode 行政区划编码列表
     * @出参： List<IdtMonitorValue> 只会有三个值indicators_id, division_code, monitor_value。其中monitor_value为平均值
     * @作者： 陈宏成
     * @日期： 2021/11/9
     */
    List<IdtMonitorValue> listAvgMonitorValue(List<String> idtIdList, List<String> divisionCode);

    /**
     * @作者: 陈宏成  2021-08-04
     * @描述:   计算上一监测值，根据更新周期，如果是年度更新，就查指标监测值里面monitor_time为年度的上一条监测值，
     *         如果上一年没有，则往前继续追溯。如果是月度更新，就查指标监测值里面monitor_time为月度的上一条监测值
     * @参数: indicatorsId：指标模型ID
     * @参数: divisionCode：行政区划编号
     * @参数: currentUpdateTime：当前更新时间，会查询比这个更新时间更早的上次更新的记录，格式: yyyy 或者 yyyy-MM 或者 yyyy-M
     * @参数: currentUpdateTime：当前更新时间，会查询比这个更新时间更早的上次更新的记录，年：2020；月：2020-01；季度：2020-1
     * @参数: updateCycle: 更新周期，1-年度，2-月度，3-季度（或者：year-年度，month-月度，quarter-季度）
     * @返回:
     */
    IdtMonitorValue getLastMonitorValue(String indicatorsId, String divisionCode, String currentUpdateTime, String updateCycle);

    /**
    * @描述: 计算指标预警状态
    * @入参:
    * @出参:
    * @作者: 代鹏刚
    * @日期: 2021/11/11 12:30
    **/
    String getWarnStatus(String indicatorsId, String monitorValue, String monitorTime, String divisionCode);

    /**
     * 检查时间字符串是否符合监测时间规范
     * @入参： monitorTime 监测时间，年：2020；月：2020-05；季：2020-4
     * @入参： isThrowException 不符合规范时是否抛出异常
     * @出参: false -- 不规范，true -- 规范
     * @作者： 陈宏成
     * @日期： 2021/11/16
     */
    boolean checkMonitorTime(String monitorTime, boolean isThrowException);

    /**
     * 检查时间字符串是否符合指标更新周期
     * @param idtId 指标id
     * @param monitorTime 监测时间，年：2020；月：2020-05；季：2020-4
     * @param isThrowException 不符合规范时是否抛出异常
     * @return false -- 不规范，true -- 规范
     * @author 陈宏成
     * @date 2021/12/23
     */
    boolean checkMonitorTimeAccordWithUpdateCycle(String idtId, String monitorTime, boolean isThrowException);

    /**
     * 计算评估结果状态
     * @param code 指标体系编码 如果不传，则默认读取 monitor-warning
     * @param indicatorsId 指标id
     * @param monitorValue 监测数值
     * @param monitorTime 监测时间，年：2020
     * @param divisionCode 行政区划编码
     * @return 评估结果
     * @author lzy
     * @date 2023/04/25
     */
    String getEstimateStatus(String code, String indicatorsId, String monitorValue, String monitorTime, String divisionCode);

    /**
     * @描述: 根究指标填报同步更新指标监测值
     * @入参:
     * @出参:
     * @作者: lzy
     * @日期: 2023/5/26 16:29
     **/
    void updateDataByFillTask(String divisionCode, String year, List<IdtFillValue> values);
}
